#pragma once
/*
*	预定义常数,作为函数返回值或者参数,必要时可以进行 '&', '|' 操作.

	输入输出完成端口（Input/Output Completion Port，IOCP）, 是支持多个同时发生的异步I/O操作的应用程序编程接口，
  在Windows NT的3.5版本以后，或AIX5版以后或Solaris第十版以后，开始支持。
	
	IOCP特别适合C/S模式网络服务器端模型。因为，让每一个socket有一个线程负责同步（阻塞）数据处理，
  one-thread-per-client的缺点是：一是如果连入的客户多了，就需要同样多的线程；二是不同的socket的数据处理都要线程切换的代价
	
	通常的办法是，线程池中的工作线程的数量与CPU内核数量相同，以此来最小化线程切换代价。
  一个IOCP对象，在操作系统中可关联着多个Socket和（或）文件控制端。 
  IOCP对象内部有一个先进先出（FIFO）队列，用于存放IOCP所关联的输入输出端的服务请求完成消息。
  请求输入输出服务的进程不接收IO服务完成通知，而是检查IOCP的消息队列以确定IO请求的状态。 
  （线程池中的）多个线程负责从IOCP消息队列中取走完成通知并执行数据处理；
  如果队列中没有消息，那么线程阻塞挂起在该队列。这些线程从而实现了负载均衡
*/

//缓冲错误
constexpr int IOCP_BUFFERROR = 0x0001;;

/* 操作正在进行中 */
constexpr int IOCP_PENDING = 0x0002; 

//未初始化
constexpr int IOCP_UNINITIALIZED = 0x0004;

//销毁失败
constexpr int IOCP_DESTROYFAILED = 0x0008;

//读取时间
constexpr int IOCP_READTIMEO = 0x0010;

//发送
constexpr int IOCP_SEND = 0x0020;

constexpr int IOCP_RECV = 0x0040;

constexpr int IOCP_CONNECT = 0x0080;

constexpr int IOCP_ACCEPT = 0x0100;

constexpr int IOCP_CANCELED = 0x0200;

constexpr int IOCP_BUSY = 0x0400;

constexpr int IOCP_REMOVE = 0x0800;

constexpr int IOCP_WRITETIMEO = 0x1000;

constexpr int IOCP_HANDLE_CLOSED = 0x2000;

constexpr int IOCP_DELAY_READ = 0x4000;

constexpr int IOCP_DELAY_WRITE = 0x8000;

constexpr int IOCP_SESSIONTIMEO = 0x010000;

// 所有常数的集合 
constexpr int IOCP_ALL = 0x7FFFFFFF; 

//未定义结果,通过getLastError可以获得错误码
constexpr int IOCP_UNDEFINED = 0xFFFFFFFF;

/* 其他的预定义常数 */
void* const IOCP_NULLKEY = (void*)0;

constexpr int IOCP_HANDLE_SOCKET = 1;

constexpr int IOCP_HANDLE_FILE = 2;

//操作成功
constexpr int IOCP_SUCESS = 0; 

//空闲状态
constexpr int IOCP_NONE = 0;

//套接字状态正常,可以调用所有sock函数
constexpr int IOCP_NORMAL = 0; 

//速度限制时,最多延时2000毫秒,过长的延时可能导致连接被客户端断开 
constexpr int IOCP_MAXWAITTIME_ONSPEEDLMT = 2000; 

// 速度限制时,最小包的字节数
constexpr int IOCP_MINBUFLEN_ONSPEEDLMT = 512; 

/*
* 类型定义
*/
typedef void* iocpKey;
typedef void(*IOCPProcCallBack)(iocpKey k, int flags, bool result, int transfered, byte* buf, size_t len, void* param);

